Computer systems typically utilize a layered approach for implementing functionalities relating to communications frameworks where a protocol layer is a program module for processing different portions of data traveling from a network to the application or when the application decides to send data out to remote peer over the network. The layered approach requires examination of data by each protocol layer to determine if any work needs to be performed by that layer before sending the data to the next protocol layer.
Conventional perimeters provide per module, per protocol stack layer, or horizontal perimeters. This leads to the same packets being processed on more than one CPU in a multi-CPU environment. Processing the same packets on more than one CPU through the software layers leads to excessive context switching, increased latencies, and poor CPU data locality (e.g., cache locality). Under heavy load, the problem is compounded by the various locations a packet can get queued and by the various threads that finally process the packet. As a result, packets for the same connection go through various protocol layers where they have to contend for access to their state structures at each layer.